/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.invoice.controller;

import com.invoice.busines.InventarioBO;
import com.invoice.busines.InventarioBOImpl;
import com.invoice.busines.dto.ArticuloDTO;
import com.invoice.busines.dto.ArticulosInventarioDTO;
import com.invoice.busines.dto.InventarioCampoDTO;
import com.invoice.busines.dto.InventarioDTO;
import com.invoice.busines.dto.VendedorDTO;
import com.invoice.enums.Estado;
import com.invoice.service.contadores.Contador;
import com.invoice.service.contadores.ContadorNumGuia;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author laura
 */
@ManagedBean
@SessionScoped
public class InventarioBean {
    static final Logger logger = Logger.getLogger(VendedorBean.class.getName());
    private InventarioDTO inventarioDTO = new InventarioDTO();
    private ArticulosInventarioDTO articulosInventarioDTO = new ArticulosInventarioDTO();
    private List<InventarioCampoDTO> labels = new ArrayList<InventarioCampoDTO>();
    private final InventarioBO inventarioBO = new InventarioBOImpl();
    private List<InventarioDTO> inventarios = new ArrayList<InventarioDTO>();
    private VendedorDTO vendedorDTO = new VendedorDTO();
    private boolean habBusquedaVendedor = true;
    private boolean habEdicion = false;
    private String valueButtonVendedor = "Añadir Vendedor";
    @PostConstruct
    public void init() {
        try {
            habEdicion=false;
            inventarios = inventarioBO.findAll();
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
    }

    public String getValueButtonVendedor() {
        return valueButtonVendedor;
    }

    public boolean isHabBusquedaVendedor() {
        return habBusquedaVendedor;
    }

    public VendedorDTO getVendedorDTO() {
        return vendedorDTO;
    }

    public void setVendedorDTO(VendedorDTO vendedorDTO) {
        this.vendedorDTO = vendedorDTO;
    }

    public boolean getHabEdicion(){
        return habEdicion;
    }    
    public InventarioDTO getInventarioDTO() {
        return inventarioDTO;
    }    
    public void setInventarioDTO(InventarioDTO inventarioDTO) {
        this.inventarioDTO = inventarioDTO;
    }

    public ArticulosInventarioDTO getArticulosInventarioDTO() {
        return articulosInventarioDTO;
    }

    public void setArticulosInventarioDTO(ArticulosInventarioDTO articulosInventarioDTO) {
        this.articulosInventarioDTO = articulosInventarioDTO;
    }

    public List<InventarioCampoDTO> getLabels() {
        return labels;
    }
    
    public List<InventarioDTO> inventarios() {
        try {
            inventarios = inventarioBO.findAll();
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        return inventarios;
    }
    
    public String saveInventario(){
        if(labels != null){
            inventarioDTO.setInventarioCampoDTOs(labels);
        }
        try {
            if(habEdicion){
                inventarioBO.updateInventario(inventarioDTO);
            } else {
                inventarioDTO = inventarioBO.addInventario(inventarioDTO);
            }
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        habEdicion = false;
        return "ListaInventarios";
    }
    
    public String editInventario(){
        habEdicion = true;
        habBusquedaVendedor = true;
        articulosInventarioDTO = new ArticulosInventarioDTO();
        vendedorDTO = inventarioDTO.getVendedorDTO();
        labels = inventarioDTO.getInventarioCampoDTOs();
        if(labels == null){
            labels = new ArrayList<InventarioCampoDTO>();
        }
        valueButtonVendedor = "Añadir Vendedor";
        return "RegistroInventario";
    }
    
    public String addInventario(){
        habEdicion = false;
        habBusquedaVendedor = true;
        inventarioDTO = new InventarioDTO();
        inventarioDTO.setFecha(new Date());
        articulosInventarioDTO = new ArticulosInventarioDTO();
        vendedorDTO = new VendedorDTO();
        labels = new ArrayList<InventarioCampoDTO>();
        valueButtonVendedor = "Añadir Vendedor";
        return "RegistroInventario";
    }
    public void addInventarioCampo() {
        InventarioCampoDTO inventarioCampoDTO = new InventarioCampoDTO();
        labels.add(inventarioCampoDTO);       
    }
    public void disabledInventario(){
        boolean flag = true;
        try {
            for(ArticulosInventarioDTO articulosInventarioDTO1 : inventarioDTO.getArticulosInventario()){
                BigDecimal stock = articulosInventarioDTO1.getArticuloDTO().getStock().subtract(articulosInventarioDTO1.getCantidad());
                if(stock.compareTo(BigDecimal.ZERO) == 1){
                    articulosInventarioDTO1.getArticuloDTO().setStock(stock);
                } else{
                    addMessage("Stock no disponible","No se puede borrar, parte del stock ya fue vendido: "+articulosInventarioDTO1.getArticuloDTO().getCode());
                    flag = false;
                }
            }
            if(flag){
                inventarioDTO.setEstado(Estado.Anulado);
                inventarioBO.updateInventario(inventarioDTO);
            }
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
    }
    
    public void updatePrecio(){
        if(articulosInventarioDTO.getArticuloDTO() != null){
            articulosInventarioDTO.setPco(articulosInventarioDTO.getArticuloDTO().getPrecioCompra());
        }
    }
    
    public void agregarItem() {
        boolean flag = false;
        if(inventarioDTO.getArticulosInventario() != null){
            for (ArticulosInventarioDTO articulosInventarioDTO1 : inventarioDTO.getArticulosInventario()) {
                if(articulosInventarioDTO1.getArticuloDTO().getIdArticulo().equals(articulosInventarioDTO.getArticuloDTO().getIdArticulo())){
                    addMessage("Duplicado","Artículo " + articulosInventarioDTO.getArticuloDTO().getDescripcion()+" ya está en la lista");
                    flag = true;
                    break;
                }
            }
        }
        if(flag == false){
            BigDecimal stock = articulosInventarioDTO.getArticuloDTO().getStock();
            ArticuloDTO articuloDTO = articulosInventarioDTO.getArticuloDTO();
            articuloDTO.setStock(stock.add(articulosInventarioDTO.getCantidad()));
            articuloDTO.setPrecioCompra(articulosInventarioDTO.getPco());
            articulosInventarioDTO.setArticuloDTO(articuloDTO);
            inventarioDTO.addArticuloInventario(articulosInventarioDTO.myClone());
        }
        articulosInventarioDTO = new ArticulosInventarioDTO();
    }
    
    public void agregarVendedor(){
        try {
            if(vendedorDTO != null && vendedorDTO.getIdUsuario()!= null){
                inventarioDTO.setVendedorDTO(vendedorDTO);
                vendedorDTO = new VendedorDTO();
            }
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Error al agregar", e);
        }
    }
    public void buscarVendedor(){
        habBusquedaVendedor = !habBusquedaVendedor;
        if(!habBusquedaVendedor){
            valueButtonVendedor = "Cancelar";
        } else {
            valueButtonVendedor = "Añadir Vendedor";
        }
        vendedorDTO = new VendedorDTO();
        inventarioDTO.setVendedorDTO(vendedorDTO);
    }
    
    public void onCancel() { 
        ArticuloDTO articuloDTO = articulosInventarioDTO.getArticuloDTO();
        articuloDTO.setStock(articuloDTO.getStock().subtract(articulosInventarioDTO.getCantidad()));
        articulosInventarioDTO.setArticuloDTO(articuloDTO);      
        inventarioDTO.removeArticuloInventario(articulosInventarioDTO);
    }
        
    public void addMessage(String summary, String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
}